<template>
	<div>实用方法</div>
</template>

<script setup lang="ts">
import { number } from 'echarts'

// 1. 生成随机字符串
const randomString = () => Math.random().toString(36).slice(2)

// 2.转义HTML特殊字符
const escape = (str: any) => str.replace(/[&<>"']/g, (m) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[m]))
// escape('<div class="medium">Hi Medium.</div>')

// 3.将字符串中每个单词的第一个字符大写
const uppercaseWords = (str: any) => str.replace(/^(.)|\s+(.)/g, (c) => c.toUpperCase())
// uppercaseWords('hello world'); // 'Hello World'

// 4.将字符串转换为驼峰命名法
const toCamelCase = (str: any) => str.trim().replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))
/**
toCamelCase('background-color') // backgroundColor
toCamelCase('-webkit-scrollbar-thumb') // WebkitScrollbarThumb
toCamelCase('_hello_world') // HelloWorld
toCamelCase('hello_world') // helloWorld
*/

// 5.删除数组中的重复值
const removeDuplicates = (arr: number[]) => [...new Set(arr)]
// console.log(removeDuplicates([1, 2, 2, 3, 3, 4, 4, 5, 5, 6]))// [1, 2, 3, 4, 5, 6]

// 6.展平数组
const flat: any = (arr: any) =>
	[].concat.apply(
		[],
		arr.map((a: string) => (Array.isArray(a) ? flat(a) : a))
	)
// Or
// const flat = (arr) => arr.reduce((a, b) => (Array.isArray(b) ? [...a, ...flat(b)] : [...a, b]), [])
// flat(['cat', ['lion', 'tiger']]) // ['cat', 'lion', 'tiger']

// 7.从数组中删除假值
const removeFalsy = (arr: any) => arr.filter(Boolean)
// removeFalsy([0, 'a string', '', NaN, true, 5, undefined, 'another string', false]) // ['a string', true, 5, 'another string']

// 8.检查数字是偶数还是奇数
const isEven = (num: number) => num % 2 === 0
// isEven(2) // true
// isEven(1) // false

// 9.获取两个数字之间的随机整数
// 该方法用于获取两个数字之间的随机整数。
const random = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1) + min)
// random(1, 50) // 25
// random(1, 50) // 34

// 10. 获取参数的平均值
// 我们可以使用reduce方法来获取我们在此函数中提供的参数的平均值。
const average = (...args: any[]) => args.reduce((a, b) => a + b) / args.length
average(1, 2, 3, 4, 5) // 3

// 11.将数字截断为固定小数点
// 使用 Math.pow() 方法，我们可以将数字截断到函数中提供的某个小数点。
const round: any = (n: number, d: number) => Number(Math.round(n + 'e' + d) + 'e-' + d)
// round(1.005, 2) //1.01
// round(1.555, 2) //1.56

// 12.计算两个日期相差天数
// 有时候我们需要计算两个日期之间的天数，一行代码就可以完成。
const diffDays = (date: any, otherDate: any) => Math.ceil(Math.abs(date - otherDate) / (1000 * 60 * 60 * 24))
// diffDays(new Date('2023-8-1'), new Date('2023-8-31'))

// 13.从日期中获取一年中的第几天
// 您想知道某个日期是一年中的第几天吗？
const dayOfYear = (date: any) => Math.floor((date - <any>new Date(date.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
// dayOfYear(new Date())

// 14.生成随机的十六进制颜色
// 如果您需要随机颜色值，这个函数就可以了。
const randomColor = () => `#${Math.random().toString(16).slice(2, 8).padEnd(6, '0')}`
// randomColor()

// 15.将RGB颜色转换为十六进制
const rgbToHex = (r: number, g: number, b: number) => '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)
// rgbToHex(255, 255, 255) // '#ffffff'

// 16.清除所有cookie
const clearCookies = () =>
	document.cookie.split(';').forEach((c) => (document.cookie = c.replace(/^ +/, '').replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`)))

// 17.检测深色模式
const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches

// 18.交换两个变量
// [foo, bar] = [bar, foo]

// 19. pause for a while 暂停一会儿
const pause = (millis: number) => new Promise((resolve) => setTimeout(resolve, millis))
const fn = async () => {
	await pause(1000)
	console.log('fatfish') // 1s later
}
// fn()
</script>

<style scoped lang="scss"></style>
